package com.study.entity;

import lombok.Data;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.env.Environment;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;

import java.io.IOException;


@Data
@Component
//@PropertySource("classpath:config.application.yml")

//@PropertySouce是spring3.1开始引入的基于java config的注解。
//通过@PropertySource注解将properties配置文件中的值存储到Spring的 Environment中，Environment接口提供方法去读取配置文件中的值，参数是properties文件中定义的key值。
public class ValueModel {

    @Value("I LOVE YOU!") //注入普通字符串
    private String normal;

    @Value("#{systemProperties['os.name']}") //注入操作系统属性
    private String osName;

    @Value("#{T(java.lang.Math).random() * 100.0}") //注入表达式结果   #{} 是SpEL表达式
    private String randomNum;

    @Value("#{user.address}") //注入其他Bean属性
    private String address;

    @Value("classpath:/test.txt") //注入文件资源
    //如果文件不存在，则报错： class path resource [test.txt] cannot be opened because it does not exist
    private Resource testFile;
    @Value("http://www.baidu.com") //注入网址资源
    private Resource testUrl;
    @Value("${myframe.user.name}") // 注入配置文件
    private String userName;

    @Autowired
    private Environment environment;

    //要想使用@Value 用${}占位符注入属性，这个bean是必须的，这个就是占位bean
//    @Bean // 注入配置文件
//    public static PropertySourcesPlaceholderConfigurer propertyConfigurer(){
//        return new PropertySourcesPlaceholderConfigurer();
//    }

    public void output() {
        try {
            System.out.println(normal);
            System.out.println(osName);
            System.out.println(randomNum);
            System.out.println(address);
            System.out.println(IOUtils.toString(testFile.getInputStream()));
            System.out.println(IOUtils.toString(testUrl.getInputStream()));
            System.out.println(userName);
            System.out.println(environment.getProperty("myframe.user.name"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}